## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2 ✓ purrr 0.3.4
## ✓ tibble 3.0.4 ✓ dplyr 1.0.2
## ✓ tidyr 1.1.2 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
## Loading required package: airports
## Loading required package: cherryblossom
## Loading required package: usdata
##
## Attaching package: 'maps'
## The following object is masked from 'package:purrr':
##
## map
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
## Linking to GEOS 3.8.1, GDAL 3.1.1, PROJ 6.3.1
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## state = col_character(),
## est_pop_2018 = col_double()
## )
Welcome to our final!
Analyzing the Relationship Between COVID-19 and Mask Use

Research and Project Inspiration
In July, the New York Times published an article entitled A Detailed Map of Who Is Wearing Masks in the U.S. The interactive map was informative regarding the presence of mask-wearing across the United States. To create this map, columnists Josh Katz, Margot Sanger-Katz and Kevin Quealy analyzed information from the County-level Data for Mask Use in the United States. This dataset, paired with the COVID-19 data we’ve been using in our class throughout the module, allowed us to assess the relationship between mask-wearing and COVID cases across the country. Specifically, are states where mask-wearing is greater, are COVID cases lower?
COVID-19 Map
In order to find the correlation between total COVID-19 cases and mask wearing, we created two individual maps for each to display the COVID-19 data and mask data in each state.

Mask Map
To find out how often people in the US were wearing masks, we created a map to display mask use. This map shows the percentage of people who always wear masks when leaving the house.

Our mask data shows the frequency of mask wearing in each state. The New York Times article analyzed the map and determined that mask use is high in the Northeast and the West, and lower in the Plains and parts of the South. The article also focused on differences on the local level. For instance, mask wearing is high in Washington, D.C, but in rural subsets of Maryland and Virginia, norms seem to differ. The columnists found that generally in urban areas, mask wearing was more common.
However, the New York Times also reported that mask-wearing in the U.S was relatively high. This could be because they conducted a self reported survey. The survey asked: “how often do you wear a mask in public when you expect to be within 6ft of another person?” The options were: “always, frequently, sometimes, rarely, and never.” On average, around 80% of Americans report mask use either “always” or “frequently” in public within 6ft of others.
The article further stressed the implications of a national mask wearing mandate. The columnists maintain that it would be difficult to achieve such a thing. However, research suggests that mandates are effective. For example, implementation of laws with increasing the use of seatbelts and the vaccination rates among school-aged children. Laws may be helpful to decrease health risk and improve overall percentages.
Masks vs. COVID-19
So what is the relationship between mask wearing and COVID-19 infection? When we view our maps side by side, we observe patterns between the two.

When looking at these maps, we can observe the correlation between mask use and COVID-19 case rates. From the maps, there appears to be an inverse relationship between mask use and cases. For example, North Dakota has the highest rate of COVID-19 infection, and many counties report limited mask use. In California, there are fewer cases and a greater frequency of mask use.
Katz, Sanger-Katz, and Quealy also illustrated that mask use is often a partisan issue politically. President Trump and other Republican officials have downplayed the necessity of mask-wearing, and expressed negative reactions to a national mandate. The survey shows that Republicans are generally less likely to wear masks, despite self-reports being high among Americans. Partisanship, it turns out, is the biggest indicator of mask-wearing likelihood, not age or where you live, or other variables, according to the article.
Rather than political party, and by county, we wanted to determine the relationship between mask-wearing and COVID cases at the state level.
Let’s Take a Closer Look
In order to analyze the relationship between mask use and COVID-19 spread, we took a closer look at Georgia to see how the two compared on the county level.

In Georgia, it’s harder to find a correlation between mask use and COVID-19 cases that is consistent with our data on the state level. For example, Atlanta has a relatively high percentage of mask use but still has high rates of infection. One explanation for this could be the size of the city. Because Atlanta is more densely populated than rural areas, it makes sense that there is a higher number of cases simply because there are more people.
Politics in Georgia: Stacey Abrams & the 2020 Election - what does this mean in terms of our data?
Source: Stacey Abrams Profile, NYT Article, Georgia 2020 Presidential Election Results- via Politico
Source: Stacey Abrams Profile

While considering Georgia’s COVID cases & mask wearing likelihood, our group thought about the outcome of the 2020 presidential election. The NYT article clarified that political affiliation was the greatest predictor of mask-wearing probability across the board. Georgia has been solidly “red” since 1972 (with the exception of Jimmy Carter in ’76 and ’80, and Bill Clinton in ’92). However, it’s important to note that Georgia has a history of suppressing Black voters, a demographic that has voted solidly Democratic throughout American history. However, for the first time in nearly three decades, a Democratic president-elect is set to carry Georgia into the next term. This can be credited to Stacey Abrams, one-time governor candidate in Georgia and a nationwide voice on voting rights. Abrams raised millions of dollars to help register hundreds of thousands of new voters, which inevitably turned Georgia blue in 2020.
Georigia Election Results 2020- via politico https://www.politico.com/2020-election/results/georgia/
Urban areas like Atlanta and Columbus voted overwhelmingly blue in 2020. Abrams facilitated an uptake in voter registration and turnout in these places, which are also among areas in Georgia where mask-wearing is highest. Cases in Atlanta are also roughly around 40,000, the most cases statewide. However, with a population of nearly 500,000, this can be expected. Additionally, in rural areas, there is not necessarily more cases than in Atlanta, but residents are less likely to wear a mask. Generally, residents also voted Republican in these areas. For example, Dade county has approximately 10,000 cases, but there is a 7% chance an individual will be masked in public, and voted about 80% in favor of Trump over Biden (20%). This almost completely contrasts with urban counties in Atlanta: pro-biden, more cases, and far greater mask-wearing likelihood. It is interesting to consider Abrams’ role in registering voters in Georgia that helped flip the state in 2020, and how those voting demographics correspond to the NYT mask wearing data, and the dataset exploring COVID cases nationwide. It appears as though the assertion that political affiliation corresponds to mask wearing remains true in Georgia.
Conclusion
Our group concluded that there is evidence to suggest that mask wearing is an effective precaution to take when it comes to protecting others and yourself from COVID-19. We also found that certain underlying variables, such as political affiliation, population density, and city vs. country surroundings factored into the relationship between mask-use and COVID cases. As seen with Atlanta, Georgia, COVID cases were comparatively higher than surrounding counties, as was mask-wearing probability. This goes against our original thought process: higher mask use did not necessarily mean less COVID cases. However, we maintain that this trend is attributed to population density rather than the effectiveness of mask-wearing. It makes sense that a bustling metropolitan area of 500,000 people has more cases than less densely populated areas. For instance, Dade county has about 16,000 people. While our initial thought process diverted slightly as our project progressed, it’s clear that the relationship between mask wearing and COVID in the United States is strictly correlated in several respects.
LS0tCnRpdGxlOiAiRmluYWwgUHJvamVjdCIKYXV0aG9yOiAiS3Jpc3RpbiBCcnlhbiwgT2xpdmlhIExpdGtlLCBNYXJ5IE1jRG9ubmVsbCIKZGF0ZTogIjEyLzEzLzIwMjAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBjb3NtbwogICAga2VlcF9tZDogVFJVRQogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCmBgYHtyIGxpYnJhcmllc30KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShtYXBzKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdwbG90cykKI2xpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGdndGhlbWVzKQojbGlicmFyeSh1c21hcCkKI2xpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgpgYGB7ciBkYXRhfQpjb3ZpZDE5IDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbnl0aW1lcy9jb3ZpZC0xOS1kYXRhL21hc3Rlci91cy1jb3VudGllcy5jc3YiKQoKbWFza19kYXRhIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20va3Jpc3RpbmJyeWFuL2NvdmlkLTE5LWRhdGEvbWFzdGVyL21hc2stdXNlL21hc2stdXNlLWJ5LWNvdW50eS5jc3YiKQoKY2Vuc3VzX3BvcF9lc3RfMjAxOCA8LSByZWFkX2NzdigiaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy82dHh3djNiNG5nN3BlcGUvdXNfY2Vuc3VzXzIwMThfc3RhdGVfcG9wX2VzdC5jc3Y/ZGw9MSIpICU+JSAKICBzZXBhcmF0ZShzdGF0ZSwgaW50byA9IGMoImRvdCIsInN0YXRlIiksIGV4dHJhID0gIm1lcmdlIikgJT4lIAogIHNlbGVjdCgtZG90KSAlPiUgCiAgbXV0YXRlKHN0YXRlID0gc3RyX3RvX2xvd2VyKHN0YXRlKSkKYGBgCgojIFdlbGNvbWUgdG8gb3VyIGZpbmFsIQojIEFuYWx5emluZyB0aGUgUmVsYXRpb25zaGlwIEJldHdlZW4gQ09WSUQtMTkgYW5kIE1hc2sgVXNlCgohW10oSU1HXzAwMTMucG5nKQoKIyMgUmVzZWFyY2ggYW5kIFByb2plY3QgSW5zcGlyYXRpb24KCkluIEp1bHksIHRoZSBOZXcgWW9yayBUaW1lcyBwdWJsaXNoZWQgYW4gYXJ0aWNsZSBlbnRpdGxlZCBbQSBEZXRhaWxlZCBNYXAgb2YgV2hvIElzIFdlYXJpbmcgTWFza3MgaW4gdGhlIFUuUy5dKGh0dHBzOi8vd3d3Lm55dGltZXMuY29tL2ludGVyYWN0aXZlLzIwMjAvMDcvMTcvdXBzaG90L2Nvcm9uYXZpcnVzLWZhY2UtbWFzay1tYXAuaHRtbCkgVGhlIGludGVyYWN0aXZlIG1hcCB3YXMgaW5mb3JtYXRpdmUgcmVnYXJkaW5nIHRoZSBwcmVzZW5jZSBvZiBtYXNrLXdlYXJpbmcgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLiBUbyBjcmVhdGUgdGhpcyBtYXAsIGNvbHVtbmlzdHMgSm9zaCBLYXR6LCBNYXJnb3QgU2FuZ2VyLUthdHogYW5kIEtldmluIFF1ZWFseSBhbmFseXplZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDb3VudHktbGV2ZWwgRGF0YSBmb3IgTWFzayBVc2UgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoaXMgZGF0YXNldCwgcGFpcmVkIHdpdGggdGhlIENPVklELTE5IGRhdGEgd2UndmUgYmVlbiB1c2luZyBpbiBvdXIgY2xhc3MgdGhyb3VnaG91dCB0aGUgbW9kdWxlLCBhbGxvd2VkIHVzIHRvIGFzc2VzcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWFzay13ZWFyaW5nIGFuZCBDT1ZJRCBjYXNlcyBhY3Jvc3MgdGhlIGNvdW50cnkuIFNwZWNpZmljYWxseSwgYXJlIHN0YXRlcyB3aGVyZSBtYXNrLXdlYXJpbmcgaXMgZ3JlYXRlciwgYXJlIENPVklEIGNhc2VzIGxvd2VyPwoKCmBgYHtyfQpjb3ZpZF9kYXRhIDwtIGNvdmlkMTkgJT4lIAogIGxlZnRfam9pbihtYXNrX2RhdGEsIAogICAgICAgICAgICBieSA9IGMoImZpcHMiID0gIkNPVU5UWUZQIikpCmBgYAo8IS0tID4+Pj4+Pj4gODc1YzhjMGJkZWY5ZTllNWM5Yjk5Njg4NzZmZmUzMzYwMDc4NzRmNSAtLT4KCiMjIENPVklELTE5IE1hcAoKSW4gb3JkZXIgdG8gIGZpbmQgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdG90YWwgQ09WSUQtMTkgY2FzZXMgYW5kIG1hc2sgd2VhcmluZywgd2UgY3JlYXRlZCB0d28gaW5kaXZpZHVhbCBtYXBzIGZvciBlYWNoIHRvIGRpc3BsYXkgdGhlIENPVklELTE5IGRhdGEgYW5kIG1hc2sgZGF0YSBpbiBlYWNoIHN0YXRlLiAKCmBgYHtyfQpzdGF0ZXNfbWFwID0gbWFwX2RhdGEoInN0YXRlIikKCmNvdmlkX21hcCA8LSBjb3ZpZF9kYXRhICU+JQogIGZpbHRlcihkYXRlID09IG1heChkYXRlKSkgJT4lCiAgbXV0YXRlKHN0YXRlID0gc3RyX3RvX2xvd2VyKHN0YXRlKSkgJT4lCiAgbGVmdF9qb2luKGNlbnN1c19wb3BfZXN0XzIwMTgsCiAgICAgICAgICAgIGJ5ID0gInN0YXRlIikgJT4lCiAgZ3JvdXBfYnkoc3RhdGUpICU+JQogIG11dGF0ZShjYXNlX3JhdGUgPSBzdW0oY2FzZXMpL2VzdF9wb3BfMjAxOCkgJT4lCiAgZ2dwbG90KGFlcyhmaWxsID0gY2FzZV9yYXRlKSkgKwogIGdlb21fbWFwKGFlcyhtYXBfaWQgPSBzdGF0ZSksCiAgICAgICAgICAgbWFwID0gc3RhdGVzX21hcCkgKwogIGxhYnModGl0bGUgPSAiQ3VycmVudCBDT1ZJRC0xOSBDYXNlcyIsIGZpbGwgPSAiJSBJbmZlY3RlZCIpICsKICBleHBhbmRfbGltaXRzKHggPSBzdGF0ZXNfbWFwJGxvbmcsIHkgPSBzdGF0ZXNfbWFwJGxhdCkgKwogIHRoZW1lX21hcCgpCgpjb3ZpZF9tYXAKYGBgCgojIyBNYXNrIE1hcAoKVG8gZmluZCBvdXQgaG93IG9mdGVuIHBlb3BsZSBpbiB0aGUgVVMgd2VyZSB3ZWFyaW5nIG1hc2tzLCB3ZSBjcmVhdGVkIGEgbWFwIHRvIGRpc3BsYXkgbWFzayB1c2UuIFRoaXMgbWFwIHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gYWx3YXlzIHdlYXIgbWFza3Mgd2hlbiBsZWF2aW5nIHRoZSBob3VzZS4gIAoKYGBge3J9CmNvdW50eV9tYXAgPSBtYXBfZGF0YSgiY291bnR5IikgJT4lIAogIGRwbHlyOjpyZW5hbWUoc3RhdGUgPSByZWdpb24sIHJlZ2lvbiA9IHN1YnJlZ2lvbikKCm1hc2tfbWFwIDwtIGNvdmlkX2RhdGEgJT4lIAogIG11dGF0ZShjb3VudHkgPSBzdHJfdG9fbG93ZXIoY291bnR5KSkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgZ2dwbG90KGFlcyhmaWxsID0gQUxXQVlTKSkgKyAKICBnZW9tX21hcChhZXMobWFwX2lkID0gY291bnR5KSwKICAgICAgICAgICBtYXAgPSBjb3VudHlfbWFwKSArIAogIGxhYnModGl0bGUgPSAiTWFzayBVc2UgaW4gZWFjaCBVUyBDb3VudHkiLCBmaWxsID0gIiUgb2YgTWFzayBVc2UiKSArCiAgZXhwYW5kX2xpbWl0cyh4ID0gY291bnR5X21hcCRsb25nLCB5ID0gY291bnR5X21hcCRsYXQpICsgCiAgdGhlbWVfbWFwKCkKCm1hc2tfbWFwCmBgYAoKT3VyIG1hc2sgZGF0YSBzaG93cyB0aGUgZnJlcXVlbmN5IG9mIG1hc2sgd2VhcmluZyBpbiBlYWNoIHN0YXRlLiBUaGUgTmV3IFlvcmsgVGltZXMgYXJ0aWNsZSBhbmFseXplZCB0aGUgbWFwIGFuZCBkZXRlcm1pbmVkIHRoYXQgbWFzayB1c2UgaXMgaGlnaCBpbiB0aGUgTm9ydGhlYXN0IGFuZCB0aGUgV2VzdCwgYW5kIGxvd2VyIGluIHRoZSBQbGFpbnMgYW5kIHBhcnRzIG9mIHRoZSBTb3V0aC4gVGhlIGFydGljbGUgYWxzbyBmb2N1c2VkIG9uIGRpZmZlcmVuY2VzIG9uIHRoZSBsb2NhbCBsZXZlbC4gRm9yIGluc3RhbmNlLCBtYXNrIHdlYXJpbmcgaXMgaGlnaCBpbiBXYXNoaW5ndG9uLCBELkMsIGJ1dCBpbiBydXJhbCBzdWJzZXRzIG9mIE1hcnlsYW5kIGFuZCBWaXJnaW5pYSwgbm9ybXMgc2VlbSB0byBkaWZmZXIuIFRoZSBjb2x1bW5pc3RzIGZvdW5kIHRoYXQgZ2VuZXJhbGx5IGluIHVyYmFuIGFyZWFzLCBtYXNrIHdlYXJpbmcgd2FzIG1vcmUgY29tbW9uLiAKCkhvd2V2ZXIsIHRoZSBOZXcgWW9yayBUaW1lcyBhbHNvIHJlcG9ydGVkIHRoYXQgbWFzay13ZWFyaW5nIGluIHRoZSBVLlMgd2FzIHJlbGF0aXZlbHkgaGlnaC4gVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZXkgY29uZHVjdGVkIGEgc2VsZiByZXBvcnRlZCBzdXJ2ZXkuIFRoZSBzdXJ2ZXkgYXNrZWQ6ICJob3cgb2Z0ZW4gZG8geW91IHdlYXIgYSBtYXNrIGluIHB1YmxpYyB3aGVuIHlvdSBleHBlY3QgdG8gYmUgd2l0aGluIDZmdCBvZiBhbm90aGVyIHBlcnNvbj8iIFRoZSBvcHRpb25zIHdlcmU6ICJhbHdheXMsIGZyZXF1ZW50bHksIHNvbWV0aW1lcywgcmFyZWx5LCBhbmQgbmV2ZXIuIiBPbiBhdmVyYWdlLCBhcm91bmQgODAlIG9mIEFtZXJpY2FucyByZXBvcnQgbWFzayB1c2UgZWl0aGVyICJhbHdheXMiIG9yICJmcmVxdWVudGx5IiBpbiBwdWJsaWMgd2l0aGluIDZmdCBvZiBvdGhlcnMuIAoKVGhlIGFydGljbGUgZnVydGhlciBzdHJlc3NlZCB0aGUgaW1wbGljYXRpb25zIG9mIGEgbmF0aW9uYWwgbWFzayB3ZWFyaW5nIG1hbmRhdGUuIFRoZSBjb2x1bW5pc3RzIG1haW50YWluIHRoYXQgaXQgd291bGQgYmUgZGlmZmljdWx0IHRvIGFjaGlldmUgc3VjaCBhIHRoaW5nLiBIb3dldmVyLCByZXNlYXJjaCBzdWdnZXN0cyB0aGF0IG1hbmRhdGVzIGFyZSBlZmZlY3RpdmUuIEZvciBleGFtcGxlLCBpbXBsZW1lbnRhdGlvbiBvZiBsYXdzICB3aXRoIGluY3JlYXNpbmcgdGhlIHVzZSBvZiBzZWF0YmVsdHMgYW5kIHRoZSB2YWNjaW5hdGlvbiByYXRlcyBhbW9uZyBzY2hvb2wtYWdlZCBjaGlsZHJlbi4gTGF3cyBtYXkgYmUgaGVscGZ1bCB0byBkZWNyZWFzZSBoZWFsdGggcmlzayBhbmQgaW1wcm92ZSBvdmVyYWxsIHBlcmNlbnRhZ2VzLgoKCiMjIE1hc2tzIHZzLiBDT1ZJRC0xOQoKU28gd2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWFzayB3ZWFyaW5nIGFuZCBDT1ZJRC0xOSBpbmZlY3Rpb24/IFdoZW4gd2UgdmlldyBvdXIgbWFwcyBzaWRlIGJ5IHNpZGUsIHdlIG9ic2VydmUgcGF0dGVybnMgYmV0d2VlbiB0aGUgdHdvLiAKCmBgYHtyLCB3aWR0aCA9IDIwMH0KKGNvdmlkX21hcCB8IG1hc2tfbWFwKSArIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJDT1ZJRC0xOSB2cy4gTWFza3MiKQpgYGAKCldoZW4gbG9va2luZyBhdCB0aGVzZSBtYXBzLCB3ZSBjYW4gb2JzZXJ2ZSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBtYXNrIHVzZSBhbmQgQ09WSUQtMTkgY2FzZSByYXRlcy4gRnJvbSB0aGUgbWFwcywgdGhlcmUgYXBwZWFycyB0byBiZSBhbiBpbnZlcnNlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hc2sgdXNlIGFuZCBjYXNlcy4gRm9yIGV4YW1wbGUsIE5vcnRoIERha290YSBoYXMgdGhlIGhpZ2hlc3QgcmF0ZSBvZiBDT1ZJRC0xOSBpbmZlY3Rpb24sIGFuZCBtYW55IGNvdW50aWVzIHJlcG9ydCBsaW1pdGVkIG1hc2sgdXNlLiBJbiBDYWxpZm9ybmlhLCB0aGVyZSBhcmUgZmV3ZXIgY2FzZXMgYW5kIGEgZ3JlYXRlciBmcmVxdWVuY3kgb2YgbWFzayB1c2UuIAoKS2F0eiwgU2FuZ2VyLUthdHosIGFuZCBRdWVhbHkgYWxzbyBpbGx1c3RyYXRlZCB0aGF0IG1hc2sgdXNlIGlzIG9mdGVuIGEgcGFydGlzYW4gaXNzdWUgcG9saXRpY2FsbHkuIFByZXNpZGVudCBUcnVtcCBhbmQgb3RoZXIgUmVwdWJsaWNhbiBvZmZpY2lhbHMgaGF2ZSBkb3ducGxheWVkIHRoZSBuZWNlc3NpdHkgb2YgbWFzay13ZWFyaW5nLCBhbmQgZXhwcmVzc2VkIG5lZ2F0aXZlIHJlYWN0aW9ucyB0byBhIG5hdGlvbmFsIG1hbmRhdGUuIFRoZSBzdXJ2ZXkgc2hvd3MgdGhhdCBSZXB1YmxpY2FucyBhcmUgZ2VuZXJhbGx5IGxlc3MgbGlrZWx5IHRvIHdlYXIgbWFza3MsIGRlc3BpdGUgc2VsZi1yZXBvcnRzIGJlaW5nIGhpZ2ggYW1vbmcgQW1lcmljYW5zLiBQYXJ0aXNhbnNoaXAsIGl0IHR1cm5zIG91dCwgaXMgdGhlIGJpZ2dlc3QgaW5kaWNhdG9yIG9mIG1hc2std2VhcmluZyBsaWtlbGlob29kLCBub3QgYWdlIG9yIHdoZXJlIHlvdSBsaXZlLCBvciBvdGhlciB2YXJpYWJsZXMsIGFjY29yZGluZyB0byB0aGUgYXJ0aWNsZS4KClJhdGhlciB0aGFuIHBvbGl0aWNhbCBwYXJ0eSwgYW5kIGJ5IGNvdW50eSwgd2Ugd2FudGVkIHRvIGRldGVybWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWFzay13ZWFyaW5nIGFuZCBDT1ZJRCBjYXNlcyBhdCB0aGUgc3RhdGUgbGV2ZWwuIAoKIyMgTGV0J3MgVGFrZSBhIENsb3NlciBMb29rCgpJbiBvcmRlciB0byBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYXNrIHVzZSBhbmQgQ09WSUQtMTkgc3ByZWFkLCB3ZSB0b29rIGEgY2xvc2VyIGxvb2sgYXQgR2VvcmdpYSB0byBzZWUgaG93IHRoZSB0d28gY29tcGFyZWQgb24gdGhlIGNvdW50eSBsZXZlbC4KCmBgYHtyfQpjb3VudHlfbWFwID0gbWFwX2RhdGEoImNvdW50eSIpICU+JSAKICBkcGx5cjo6cmVuYW1lKHN0YXRlID0gcmVnaW9uLCByZWdpb24gPSBzdWJyZWdpb24pICU+JSAKICBmaWx0ZXIoc3RhdGUgPT0gImdlb3JnaWEiKQoKZ2VvcmdpYV9jYXNlcyA8LSBjb3ZpZF9kYXRhICU+JSAKICBmaWx0ZXIoc3RhdGUgPT0gIkdlb3JnaWEiKSAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IHN0cl90b19sb3dlcihjb3VudHkpLCAKICAgICAgICAgY291bnR5ID0gaWZlbHNlKGNvdW50eSA9PSAiZGVrYWxiIiwgImRlIGthbGIiLCBjb3VudHkpKSAlPiUgCiAgZ3JvdXBfYnkoY291bnR5KSAlPiUgCiAgZmlsdGVyKGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgZ2dwbG90KGFlcyhmaWxsID0gY2FzZXMpKSArIAogIGdlb21fbWFwKGFlcyhtYXBfaWQgPSBjb3VudHkpLCAKICAgICAgICAgICBtYXAgPSBjb3VudHlfbWFwKSArIAogIGxhYnModGl0bGUgPSAiQ2FzZXMgcGVyIENvdW50eSIsIGZpbGwgPSAiQ2FzZXMiKSArCiAgZXhwYW5kX2xpbWl0cyh4ID0gY291bnR5X21hcCRsb25nLCB5ID0gY291bnR5X21hcCRsYXQpICsgCiAgdGhlbWVfbWFwKCkKYGBgCgpgYGB7cn0KY291bnR5X21hcCA9IG1hcF9kYXRhKCJjb3VudHkiKSAlPiUgCiAgZHBseXI6OnJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwgcmVnaW9uID0gc3VicmVnaW9uKSAlPiUgCiAgZmlsdGVyKHN0YXRlID09ICJnZW9yZ2lhIikKCmdlb3JnaWFfbWFza3MgPC0gY292aWRfZGF0YSAlPiUgCiAgZmlsdGVyKHN0YXRlID09ICJHZW9yZ2lhIikgJT4lIAogIG11dGF0ZShjb3VudHkgPSBzdHJfdG9fbG93ZXIoY291bnR5KSwgCiAgICAgICAgIGNvdW50eSA9IGlmZWxzZShjb3VudHkgPT0gImRla2FsYiIsICJkZSBrYWxiIiwgY291bnR5KSkgJT4lIAogIGdyb3VwX2J5KGNvdW50eSkgJT4lIAogIGZpbHRlcihkYXRlID09IG1heChkYXRlKSkgJT4lIAogIGdncGxvdChhZXMoZmlsbCA9IEFMV0FZUykpICsgCiAgZ2VvbV9tYXAoYWVzKG1hcF9pZCA9IGNvdW50eSksIAogICAgICAgICAgIG1hcCA9IGNvdW50eV9tYXApICsgCiAgbGFicyh0aXRsZSA9ICIlIE1hc2sgVXNlIHBlciBDb3VudHkiLCBmaWxsID0gIiIpICsKICBleHBhbmRfbGltaXRzKHggPSBjb3VudHlfbWFwJGxvbmcsIHkgPSBjb3VudHlfbWFwJGxhdCkgKyAKICB0aGVtZV9tYXAoKQoKYGBgCgpgYGB7cn0KKGdlb3JnaWFfY2FzZXMgfCBnZW9yZ2lhX21hc2tzKSArIAogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJDT1ZJRC0xOSB2cy4gTWFza3MgaW4gR2VvcmdpYSIpCmBgYAoKSW4gR2VvcmdpYSwgaXQncyBoYXJkZXIgdG8gZmluZCBhIGNvcnJlbGF0aW9uIGJldHdlZW4gbWFzayB1c2UgYW5kIENPVklELTE5IGNhc2VzIHRoYXQgaXMgY29uc2lzdGVudCB3aXRoIG91ciBkYXRhIG9uIHRoZSBzdGF0ZSBsZXZlbC4gRm9yIGV4YW1wbGUsIEF0bGFudGEgaGFzIGEgcmVsYXRpdmVseSBoaWdoIHBlcmNlbnRhZ2Ugb2YgbWFzayB1c2UgYnV0IHN0aWxsIGhhcyBoaWdoIHJhdGVzIG9mIGluZmVjdGlvbi4gT25lIGV4cGxhbmF0aW9uIGZvciB0aGlzIGNvdWxkIGJlIHRoZSBzaXplIG9mIHRoZSBjaXR5LiBCZWNhdXNlIEF0bGFudGEgaXMgbW9yZSBkZW5zZWx5IHBvcHVsYXRlZCB0aGFuIHJ1cmFsIGFyZWFzLCBpdCBtYWtlcyBzZW5zZSB0aGF0IHRoZXJlIGlzIGEgaGlnaGVyIG51bWJlciBvZiBjYXNlcyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBhcmUgbW9yZSBwZW9wbGUuIAoKIyBQb2xpdGljcyBpbiBHZW9yZ2lhOiBTdGFjZXkgQWJyYW1zICYgdGhlIDIwMjAgRWxlY3Rpb24gLSB3aGF0IGRvZXMgdGhpcyBtZWFuIGluIHRlcm1zIG9mIG91ciBkYXRhPwpTb3VyY2U6IFtTdGFjZXkgQWJyYW1zIFByb2ZpbGVdKGh0dHBzOi8vYXBuZXdzLmNvbS9hcnRpY2xlL2VsZWN0aW9uLTIwMjAtam9lLWJpZGVuLXN0YWNleS1hYnJhbXMtZ2VvcmdpYS1hdGxhbnRhLTFkMjY1ZjM1MzAzYmU4Y2E1OTgzNmExYTk1MDE4ZDgyKSwgW05ZVCBBcnRpY2xlXShodHRwczovL3d3dy5ueXRpbWVzLmNvbS9pbnRlcmFjdGl2ZS8yMDIwLzA3LzE3L3Vwc2hvdC9jb3JvbmF2aXJ1cy1mYWNlLW1hc2stbWFwLmh0bWwpLCBbR2VvcmdpYSAyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBSZXN1bHRzLSB2aWEgUG9saXRpY29dKGh0dHBzOi8vd3d3LnBvbGl0aWNvLmNvbS8yMDIwLWVsZWN0aW9uL3Jlc3VsdHMvZ2VvcmdpYS8pCgpTb3VyY2U6IFtTdGFjZXkgQWJyYW1zIFByb2ZpbGVdKGh0dHBzOi8vYXBuZXdzLmNvbS9hcnRpY2xlL2VsZWN0aW9uLTIwMjAtam9lLWJpZGVuLXN0YWNleS1hYnJhbXMtZ2VvcmdpYS1hdGxhbnRhLTFkMjY1ZjM1MzAzYmU4Y2E1OTgzNmExYTk1MDE4ZDgyKQoKIVtdKFN0YWNleUFicmFtcy5wbmcpCgpXaGlsZSBjb25zaWRlcmluZyBHZW9yZ2lhJ3MgQ09WSUQgY2FzZXMgJiBtYXNrIHdlYXJpbmcgbGlrZWxpaG9vZCwgb3VyIGdyb3VwIHRob3VnaHQgYWJvdXQgdGhlIG91dGNvbWUgb2YgdGhlIDIwMjAgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiBUaGUgTllUIGFydGljbGUgY2xhcmlmaWVkIHRoYXQgcG9saXRpY2FsIGFmZmlsaWF0aW9uIHdhcyB0aGUgZ3JlYXRlc3QgcHJlZGljdG9yIG9mIG1hc2std2VhcmluZyBwcm9iYWJpbGl0eSBhY3Jvc3MgdGhlIGJvYXJkLiBHZW9yZ2lhIGhhcyBiZWVuIHNvbGlkbHkgInJlZCIgc2luY2UgMTk3MiAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIEppbW15IENhcnRlciBpbiAnNzYgYW5kICc4MCwgYW5kIEJpbGwgQ2xpbnRvbiBpbiAnOTIpLiBIb3dldmVyLCBpdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgR2VvcmdpYSBoYXMgYSBoaXN0b3J5IG9mIHN1cHByZXNzaW5nIEJsYWNrIHZvdGVycywgYSBkZW1vZ3JhcGhpYyB0aGF0IGhhcyB2b3RlZCBzb2xpZGx5IERlbW9jcmF0aWMgdGhyb3VnaG91dCBBbWVyaWNhbiBoaXN0b3J5LiBIb3dldmVyLCBmb3IgdGhlIGZpcnN0IHRpbWUgaW4gbmVhcmx5IHRocmVlIGRlY2FkZXMsIGEgRGVtb2NyYXRpYyBwcmVzaWRlbnQtZWxlY3QgaXMgc2V0IHRvIGNhcnJ5IEdlb3JnaWEgaW50byB0aGUgbmV4dCB0ZXJtLiBUaGlzIGNhbiBiZSBjcmVkaXRlZCB0byBTdGFjZXkgQWJyYW1zLCBvbmUtdGltZSBnb3Zlcm5vciBjYW5kaWRhdGUgaW4gR2VvcmdpYSBhbmQgYSBuYXRpb253aWRlIHZvaWNlIG9uIHZvdGluZyByaWdodHMuIEFicmFtcyByYWlzZWQgbWlsbGlvbnMgb2YgZG9sbGFycyB0byBoZWxwIHJlZ2lzdGVyIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiBuZXcgdm90ZXJzLCB3aGljaCBpbmV2aXRhYmx5IHR1cm5lZCBHZW9yZ2lhIGJsdWUgaW4gMjAyMC4gCgohW10oR2VvcmdpYSAyMDIwLnBuZykKR2VvcmlnaWEgRWxlY3Rpb24gUmVzdWx0cyAyMDIwLSB2aWEgcG9saXRpY28gaHR0cHM6Ly93d3cucG9saXRpY28uY29tLzIwMjAtZWxlY3Rpb24vcmVzdWx0cy9nZW9yZ2lhLwoKVXJiYW4gYXJlYXMgbGlrZSBBdGxhbnRhIGFuZCBDb2x1bWJ1cyB2b3RlZCBvdmVyd2hlbG1pbmdseSBibHVlIGluIDIwMjAuIEFicmFtcyBmYWNpbGl0YXRlZCBhbiB1cHRha2UgaW4gdm90ZXIgcmVnaXN0cmF0aW9uIGFuZCB0dXJub3V0IGluIHRoZXNlIHBsYWNlcywgd2hpY2ggYXJlIGFsc28gYW1vbmcgYXJlYXMgaW4gR2VvcmdpYSB3aGVyZSBtYXNrLXdlYXJpbmcgaXMgaGlnaGVzdC4gQ2FzZXMgaW4gQXRsYW50YSBhcmUgYWxzbyByb3VnaGx5IGFyb3VuZCA0MCwwMDAsIHRoZSBtb3N0IGNhc2VzIHN0YXRld2lkZS4gSG93ZXZlciwgd2l0aCBhIHBvcHVsYXRpb24gb2YgbmVhcmx5IDUwMCwwMDAsIHRoaXMgY2FuIGJlIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHksIGluIHJ1cmFsIGFyZWFzLCB0aGVyZSBpcyBub3QgbmVjZXNzYXJpbHkgbW9yZSBjYXNlcyB0aGFuIGluIEF0bGFudGEsIGJ1dCByZXNpZGVudHMgYXJlIGxlc3MgbGlrZWx5IHRvIHdlYXIgYSBtYXNrLiBHZW5lcmFsbHksIHJlc2lkZW50cyBhbHNvIHZvdGVkIFJlcHVibGljYW4gaW4gdGhlc2UgYXJlYXMuIEZvciBleGFtcGxlLCBEYWRlIGNvdW50eSBoYXMgYXBwcm94aW1hdGVseSAxMCwwMDAgY2FzZXMsIGJ1dCB0aGVyZSBpcyBhIDclIGNoYW5jZSBhbiBpbmRpdmlkdWFsIHdpbGwgYmUgbWFza2VkIGluIHB1YmxpYywgYW5kIHZvdGVkIGFib3V0IDgwJSBpbiBmYXZvciBvZiBUcnVtcCBvdmVyIEJpZGVuICgyMCUpLiBUaGlzIGFsbW9zdCBjb21wbGV0ZWx5IGNvbnRyYXN0cyB3aXRoIHVyYmFuIGNvdW50aWVzIGluIEF0bGFudGE6IHByby1iaWRlbiwgbW9yZSBjYXNlcywgYW5kIGZhciBncmVhdGVyIG1hc2std2VhcmluZyBsaWtlbGlob29kLiBJdCBpcyBpbnRlcmVzdGluZyB0byBjb25zaWRlciBBYnJhbXMnIHJvbGUgaW4gcmVnaXN0ZXJpbmcgdm90ZXJzIGluIEdlb3JnaWEgdGhhdCBoZWxwZWQgZmxpcCB0aGUgc3RhdGUgaW4gMjAyMCwgYW5kIGhvdyB0aG9zZSB2b3RpbmcgZGVtb2dyYXBoaWNzIGNvcnJlc3BvbmQgdG8gdGhlIE5ZVCBtYXNrIHdlYXJpbmcgZGF0YSwgYW5kIHRoZSBkYXRhc2V0IGV4cGxvcmluZyBDT1ZJRCBjYXNlcyBuYXRpb253aWRlLiBJdCBhcHBlYXJzIGFzIHRob3VnaCB0aGUgYXNzZXJ0aW9uIHRoYXQgcG9saXRpY2FsIGFmZmlsaWF0aW9uIGNvcnJlc3BvbmRzIHRvIG1hc2sgd2VhcmluZyByZW1haW5zIHRydWUgaW4gR2VvcmdpYS4KCiMgQ29uY2x1c2lvbgoKT3VyIGdyb3VwIGNvbmNsdWRlZCB0aGF0IHRoZXJlIGlzIGV2aWRlbmNlIHRvIHN1Z2dlc3QgdGhhdCBtYXNrIHdlYXJpbmcgaXMgYW4gZWZmZWN0aXZlIHByZWNhdXRpb24gdG8gdGFrZSB3aGVuIGl0IGNvbWVzIHRvIHByb3RlY3Rpbmcgb3RoZXJzIGFuZCB5b3Vyc2VsZiBmcm9tIENPVklELTE5LiBXZSBhbHNvIGZvdW5kIHRoYXQgY2VydGFpbiB1bmRlcmx5aW5nIHZhcmlhYmxlcywgc3VjaCBhcyBwb2xpdGljYWwgYWZmaWxpYXRpb24sIHBvcHVsYXRpb24gZGVuc2l0eSwgYW5kIGNpdHkgdnMuIGNvdW50cnkgc3Vycm91bmRpbmdzIGZhY3RvcmVkIGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hc2stdXNlIGFuZCBDT1ZJRCBjYXNlcy4gQXMgc2VlbiB3aXRoIEF0bGFudGEsIEdlb3JnaWEsIENPVklEIGNhc2VzIHdlcmUgY29tcGFyYXRpdmVseSBoaWdoZXIgdGhhbiBzdXJyb3VuZGluZyBjb3VudGllcywgYXMgd2FzIG1hc2std2VhcmluZyBwcm9iYWJpbGl0eS4gVGhpcyBnb2VzIGFnYWluc3Qgb3VyIG9yaWdpbmFsIHRob3VnaHQgcHJvY2VzczogaGlnaGVyIG1hc2sgdXNlIGRpZCBub3QgbmVjZXNzYXJpbHkgbWVhbiBsZXNzIENPVklEIGNhc2VzLiBIb3dldmVyLCB3ZSBtYWludGFpbiB0aGF0IHRoaXMgdHJlbmQgaXMgYXR0cmlidXRlZCB0byBwb3B1bGF0aW9uIGRlbnNpdHkgcmF0aGVyIHRoYW4gdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgbWFzay13ZWFyaW5nLiBJdCBtYWtlcyBzZW5zZSB0aGF0IGEgYnVzdGxpbmcgbWV0cm9wb2xpdGFuIGFyZWEgb2YgNTAwLDAwMCBwZW9wbGUgaGFzIG1vcmUgY2FzZXMgdGhhbiBsZXNzIGRlbnNlbHkgcG9wdWxhdGVkIGFyZWFzLiBGb3IgaW5zdGFuY2UsIERhZGUgY291bnR5IGhhcyBhYm91dCAxNiwwMDAgcGVvcGxlLiBXaGlsZSBvdXIgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgZGl2ZXJ0ZWQgc2xpZ2h0bHkgYXMgb3VyIHByb2plY3QgcHJvZ3Jlc3NlZCwgaXQncyBjbGVhciB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYXNrIHdlYXJpbmcgYW5kIENPVklEIGluIHRoZSBVbml0ZWQgU3RhdGVzIGlzIHN0cmljdGx5IGNvcnJlbGF0ZWQgaW4gc2V2ZXJhbCByZXNwZWN0cy4gCgo8IS0tID4+Pj4+Pj4gODc1YzhjMGJkZWY5ZTllNWM5Yjk5Njg4NzZmZmUzMzYwMDc4NzRmNSAtLT4KPCEtLSA+Pj4+Pj4+IGY2MTVjYTRmZTdmNzM1YmY5ZjI5M2Y4OWIxZDNkNGUzOTIwNzBmYzkgLS0+Cg==